
// Array.from es6

// 数组是一种类列表对象!!! 它的原型中提供了遍历和修改元素的相关操作。

// const obj = {
//   0: 1,
//   1: 2,
//   2: 3,
  // length: 3
  // length: 2 // [1, 2]
  // length: 4 // | [1, 2, 3, undefined]
  // 如果没有length 默认为 0，返回一个空数组
  // length: 0 //  []
//   push: [].push
// }
// obj -> 伪装 ->类似于数组的一种伪类型 -> 不是JS的类型

// const newArr = Array.from(obj);
// console.log(newArr);
// console.log(newArr.length); // 2 | 4 | 0

// obj.push(4); // 因为原本length为0，push后length++ 为1，那零的下标对应的是push的值，会覆盖之前定义的数据
// console.log(obj); // {0: 4, 1: 2, 2: 3, length: 1, push: ƒ}

// Array.from() => Array.from(undefined) // 直接这样会报错，
// Array.from.length // 函数的形参长度 
// console.log(Array.from.length === 1); // true

// 伪数组对象（拥有一个 length 属性和若干索引属性的任意对象）
// const arr = Array.from('string');
// console.log(arr); // ["s", "t", "r", "i", "n", "g"]

// const arr = Array.from({ length: 3 }); // 值默认为undefined
// console.log(arr); // [undefined, undefined, undefined]

// function f() {
//   return Array.from(arguments);
// }
// f(1, 2, 3); // [ 1, 2, 3 ]

// 可迭代对象（可以获取对象中的元素(依赖 Symbol.iterator), 如 Map和 Set 等）
// const set = new Set(['foo', 'bar', 'baz', 'foo']);
// console.log(Array.from(set));// [ "foo", "bar", "baz" ]

// const map = new Map([[1, 2], [2, 4], [4, 8]]);
// console.log(Array.from(map));// [[1, 2], [2, 4], [4, 8]]

// 转换为密集数组
var a = new Array(3);
// var newArr = Array.apply(null, a); // ES5
var newArr = Array.from(a); // ES6

console.log(newArr); //  [undefined, undefined, undefined]


const obj = {
  0: 1,
  1: 2,
  2: 3,
  length: 3
}
// const newArr = Array.from(obj); // [1, 2, 3]
// const data = newArr.map((item, index) => {
//   return {
//     number: 'No. '+ item,
//     order: index
//   }
// }) 
// 使用 Array的第二、第三个参数
// const data = Array.from(obj, (item, index) => {
//   return {
//     number: 'No. ' + item,
//     order: index
//   }
// });
const data = Array.from(obj, function (item, index) {
  return {
    number: this.prefix + item,
    order: index
  }
}, {
  prefix: 'No. '
});

console.log(data);


/**
 * Array.from(arrayLike[, mapFn[, thisArg]])
 * mapFn：新数组中的每个元素会执行该回调函数(执行一次 map 方法后再返回)
 * thisArg：执行回调函数 mapFn 时 this 对象。
 * 
 * 对一个类似数组或可迭代对象创建一个新的，浅拷贝的数组实例。
 * 
 * length 决定了Array.from 最终返回的新数组的长度，减裁掉 或 补齐(undefined)
 * 
 */



